#include "thirdfloor.h"
#include "ui_thirdfloor.h"
#include "start.h"
#include <QPainter>
#include <QTimer>
#include <QKeyEvent>
#include <QFont>
#include <QApplication>
#include <QTime>
#include <ctime>

ThirdFloor::ThirdFloor(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::ThirdFloor),blsRun(false)
{
    ui->setupUi(this);
    this->setWindowTitle("ThirdFloor");
    this->setGeometry(QRect(600,300,300,300));
}

ThirdFloor::~ThirdFloor()
{
    delete ui;
}

void ThirdFloor::paintEvent(QPaintEvent *event){
    QPainter painter(this);
    if(!blsRun)
        Init();

    //外墙
    painter.setPen(Qt::black);
    painter.setBrush(Qt::gray);
    painter.drawRect(0,0,300,260);
    //内墙
    painter.drawPixmap(10,10,280,240,QPixmap(":/Images/MyImage/background.jpg"));
    //画门
    painter.drawPixmap(10,130,20,20,QPixmap(":/Images/MyImage/BlueDoor.jpg"));
    painter.drawPixmap(270,130,20,20,QPixmap(":/Images/MyImage/RedDoor.jpg"));
    //画人
    painter.drawPixmap(Person.left(),Person.top(),10,10,QPixmap(":/Images/MyImage/Person.jpg"));
    //画敌人
    for(int i=0;i<19;i++)
        painter.drawPixmap(Enemy[i].left(),Enemy[i].top(),10,10,QPixmap(":/Images/MyImage/Enemy.jpg"));
    //画墙
    painter.setPen(Qt::black);
    painter.setBrush(Qt::gray);
    for(int i=0;i<19;i++)
        painter.drawRect(Wall[i]);
    //显示开始结束
    QFont font1("Courier",24);
    painter.setFont(font1);
    painter.setPen(Qt::red);
    painter.setBrush(Qt::red);
    painter.drawText(40,150,sDisplay);
    //显示生命
    QFont font2("Courier",15);
    painter.setFont(font2);
    painter.setPen(Qt::blue);
    painter.setBrush(Qt::blue);
    painter.drawText(140,290,"生命：");
    painter.drawText(210,290,QString::number(bloods));
    painter.drawText(30,290,"分数：");
    painter.drawText(90,290,QString::number(score));
    //画Secrect
    for(int i=0;i<5;i++){
        if(s[i])
            painter.drawPixmap(Secrect[i].left(),Secrect[i].top(),10,10,QPixmap(":/Images/MyImage/Secrect.jpg"));
    }

    if(blsOver){
        timer->stop();

        Person=QRect(30,120,10,10);
        painter.setPen(Qt::black);
        painter.setBrush(Qt::green);
        painter.drawRect(Person);
        blsRun=false;
        blsOver=false;
        blsSuccess=false;
        Sleep(500);
        emit Oversignal();
    }
    if(blsSuccess){
        timer->stop();

        Person=QRect(30,120,10,10);
        painter.setPen(Qt::black);
        painter.setBrush(Qt::green);
        painter.drawRect(Person);
        blsRun=false;
        blsOver=false;
        blsSuccess=false;
        Sleep(500);
        emit Successsignal();
    }
}
void ThirdFloor::Init(){
    blsRun=true;
    blsOver=false;
    blsSuccess=false;
    sDisplay="游戏开始";
    //bloods=3;
    //score=0;
    for(int i=0;i<5;i++)
        s[i]=1;
    Person=QRect(20,130,10,10);

    Wall[0]=QRect(10,110,40,10);
    Wall[1]=QRect(50,40,10,80);
    Wall[2]=QRect(60,40,70,10);
    Wall[3]=QRect(130,40,10,40);
    Wall[4]=QRect(90,80,10,70);
    Wall[5]=QRect(100,110,80,10);
    Wall[6]=QRect(170,10,10,100);
    Wall[7]=QRect(50,150,10,70);
    Wall[8]=QRect(60,180,40,10);
    Wall[9]=QRect(90,190,10,60);
    Wall[10]=QRect(130,150,10,70);
    Wall[11]=QRect(140,150,80,10);
    Wall[12]=QRect(210,160,10,90);
    Wall[13]=QRect(220,210,30,10);
    Wall[14]=QRect(210,40,10,80);
    Wall[15]=QRect(220,40,70,10);
    Wall[16]=QRect(250,80,10,110);
    Wall[17]=QRect(260,170,30,10);
    Wall[18]=QRect(170,190,10,60);

    Enemy[0]=QRect(10,170,10,10);
    Enemy[1]=QRect(40,200,10,10);
    Enemy[2]=QRect(70,190,10,10);
    Enemy[3]=QRect(60,100,10,10);
    Enemy[4]=QRect(110,100,10,10);
    Enemy[5]=QRect(150,10,10,10);
    Enemy[6]=QRect(90,30,10,10);
    Enemy[7]=QRect(10,70,10,10);
    Enemy[8]=QRect(60,160,10,10);
    Enemy[9]=QRect(100,200,10,10);
    Enemy[10]=QRect(150,160,10,10);
    Enemy[11]=QRect(200,210,10,10);
    Enemy[12]=QRect(150,120,10,10);
    Enemy[13]=QRect(180,80,10,10);
    Enemy[14]=QRect(240,10,10,10);
    Enemy[15]=QRect(240,100,10,10);
    Enemy[16]=QRect(260,110,10,10);
    Enemy[17]=QRect(220,170,10,10);
    Enemy[18]=QRect(260,180,10,10);

    Secrect[0]=QRect(80,190,10,10);
    Secrect[1]=QRect(180,240,10,10);
    Secrect[2]=QRect(40,100,10,10);
    Secrect[3]=QRect(280,10,10,10);
    Secrect[4]=QRect(220,240,10,10);

    for(int i=0;i<15;i++){
        nDirection[i]=1;}
    timer=new QTimer(this);
    timer->start(300);             //设置刷新速度
    connect(timer,SIGNAL(timeout()),SLOT(Enemy_update()));
}
void ThirdFloor::Enemy_update(){
    sDisplay="";

    //刷新敌人位置
    if(Enemy[0].left()==40)
        nDirection[0]=0;
    if(Enemy[0].left()==10)
        nDirection[0]=1;
    if(nDirection[0]){
        Enemy[0].setLeft(Enemy[0].left()+10);
        Enemy[0].setRight(Enemy[0].right()+10);
    }
    else{
        Enemy[0].setLeft(Enemy[0].left()-10);
        Enemy[0].setRight(Enemy[0].right()-10);
    }
    if(Enemy[1].left()==10)
        nDirection[1]=0;
    if(Enemy[1].left()==40)
        nDirection[1]=1;
    if(nDirection[1]){
        Enemy[1].setLeft(Enemy[1].left()-10);
        Enemy[1].setRight(Enemy[1].right()-10);
    }
    else{
        Enemy[1].setLeft(Enemy[1].left()+10);
        Enemy[1].setRight(Enemy[1].right()+10);
    }
    if(Enemy[2].top()==240)//
        nDirection[2]=0;
    if(Enemy[2].top()==190)
        nDirection[2]=1;
    if(nDirection[2]){
        Enemy[2].setTop(Enemy[2].top()+10);
        Enemy[2].setBottom(Enemy[2].bottom()+10);
    }
    else{
        Enemy[2].setTop(Enemy[2].top()-10);
        Enemy[2].setBottom(Enemy[2].bottom()-10);
    }
    if(Enemy[3].left()==80)
        nDirection[3]=0;
    if(Enemy[3].left()==60)
        nDirection[3]=1;
    if(nDirection[3]){
        Enemy[3].setLeft(Enemy[3].left()+10);
        Enemy[3].setRight(Enemy[3].right()+10);
    }
    else{
        Enemy[3].setLeft(Enemy[3].left()-10);
        Enemy[3].setRight(Enemy[3].right()-10);
    }
    if(Enemy[4].top()==50)
        nDirection[4]=0;
    if(Enemy[4].top()==100)
        nDirection[4]=1;
    if(nDirection[4]){
        Enemy[4].setTop(Enemy[4].top()-10);
        Enemy[4].setBottom(Enemy[4].bottom()-10);
    }
    else{
        Enemy[4].setTop(Enemy[4].top()+10);
        Enemy[4].setBottom(Enemy[4].bottom()+10);
    }
    if(Enemy[5].top()==100)
        nDirection[5]=0;
    if(Enemy[5].top()==10)
        nDirection[5]=1;
    if(nDirection[5]){
        Enemy[5].setTop(Enemy[5].top()+10);
        Enemy[5].setBottom(Enemy[5].bottom()+10);
    }
    else{
        Enemy[5].setTop(Enemy[5].top()-10);
        Enemy[5].setBottom(Enemy[5].bottom()-10);
    }
    if(Enemy[6].top()==30)
        nDirection[6]=0;
    if(Enemy[6].top()==10)
        nDirection[6]=1;
    if(nDirection[6]){
        Enemy[6].setTop(Enemy[6].top()+10);
        Enemy[6].setBottom(Enemy[6].bottom()+10);
    }
    else{
        Enemy[6].setTop(Enemy[6].top()-10);
        Enemy[6].setBottom(Enemy[6].bottom()-10);
    }
    if(Enemy[7].left()==40)
        nDirection[7]=0;
    if(Enemy[7].left()==10)
        nDirection[7]=1;
    if(nDirection[7]){
        Enemy[7].setLeft(Enemy[7].left()+10);
        Enemy[7].setRight(Enemy[7].right()+10);
    }
    else{
        Enemy[7].setLeft(Enemy[7].left()-10);
        Enemy[7].setRight(Enemy[7].right()-10);
    }
    if(Enemy[8].left()==120)
        nDirection[8]=0;
    if(Enemy[8].left()==60)
        nDirection[8]=1;
    if(nDirection[8]){
        Enemy[8].setLeft(Enemy[8].left()+10);
        Enemy[8].setRight(Enemy[8].right()+10);
    }
    else{
        Enemy[8].setLeft(Enemy[8].left()-10);
        Enemy[8].setRight(Enemy[8].right()-10);
    }
    if(Enemy[9].left()==120)
        nDirection[9]=0;
    if(Enemy[9].left()==100)
        nDirection[9]=1;
    if(nDirection[9]){
        Enemy[9].setLeft(Enemy[9].left()+10);
        Enemy[9].setRight(Enemy[9].right()+10);
    }
    else{
        Enemy[9].setLeft(Enemy[9].left()-10);
        Enemy[9].setRight(Enemy[9].right()-10);
    }
    if(Enemy[10].top()==240)
        nDirection[10]=0;
    if(Enemy[10].top()==160)
        nDirection[10]=1;
    if(nDirection[10]){
        Enemy[10].setTop(Enemy[10].top()+10);
        Enemy[10].setBottom(Enemy[10].bottom()+10);
    }
    else{
        Enemy[10].setTop(Enemy[10].top()-10);
        Enemy[10].setBottom(Enemy[10].bottom()-10);
    }
    if(Enemy[11].left()==180)
        nDirection[11]=0;
    if(Enemy[11].left()==200)
        nDirection[11]=1;
    if(nDirection[11]){
        Enemy[11].setLeft(Enemy[11].left()-10);
        Enemy[11].setRight(Enemy[11].right()-10);
    }
    else{
        Enemy[11].setLeft(Enemy[11].left()+10);
        Enemy[11].setRight(Enemy[11].right()+10);
    }
    if(Enemy[12].top()==140)
        nDirection[12]=0;
    if(Enemy[12].top()==120)
        nDirection[12]=1;
    if(nDirection[12]){
        Enemy[12].setTop(Enemy[12].top()+10);
        Enemy[12].setBottom(Enemy[12].bottom()+10);
    }
    else{
        Enemy[12].setTop(Enemy[12].top()-10);
        Enemy[12].setBottom(Enemy[12].bottom()-10);
    }
    if(Enemy[13].left()==200)
        nDirection[13]=0;
    if(Enemy[13].left()==180)
        nDirection[13]=1;
    if(nDirection[13]){
        Enemy[13].setLeft(Enemy[13].left()+10);
        Enemy[13].setRight(Enemy[13].right()+10);
    }
    else{
        Enemy[13].setLeft(Enemy[13].left()-10);
        Enemy[13].setRight(Enemy[13].right()-10);
    }
    if(Enemy[14].top()==30)
        nDirection[14]=0;
    if(Enemy[14].top()==10)
        nDirection[14]=1;
    if(nDirection[14]){
        Enemy[14].setTop(Enemy[14].top()+10);
        Enemy[14].setBottom(Enemy[14].bottom()+10);
    }
    else{
        Enemy[14].setTop(Enemy[14].top()-10);
        Enemy[14].setBottom(Enemy[14].bottom()-10);
    }
    if(Enemy[15].left()==220)
        nDirection[15]=0;
    if(Enemy[15].left()==240)
        nDirection[15]=1;
    if(nDirection[15]){
        Enemy[15].setLeft(Enemy[15].left()-10);
        Enemy[15].setRight(Enemy[15].right()-10);
    }
    else{
        Enemy[15].setLeft(Enemy[15].left()+10);
        Enemy[15].setRight(Enemy[15].right()+10);
    }
    if(Enemy[16].left()==280)
        nDirection[16]=0;
    if(Enemy[16].left()==260)
        nDirection[16]=1;
    if(nDirection[16]){
        Enemy[16].setLeft(Enemy[16].left()+10);
        Enemy[16].setRight(Enemy[16].right()+10);
    }
    else{
        Enemy[16].setLeft(Enemy[16].left()-10);
        Enemy[16].setRight(Enemy[16].right()-10);
    }
    if(Enemy[17].left()==240)
        nDirection[17]=0;
    if(Enemy[17].left()==220)
        nDirection[17]=1;
    if(nDirection[17]){
        Enemy[17].setLeft(Enemy[17].left()+10);
        Enemy[17].setRight(Enemy[17].right()+10);
    }
    else{
        Enemy[17].setLeft(Enemy[17].left()-10);
        Enemy[17].setRight(Enemy[17].right()-10);
    }
    if(Enemy[18].top()==240)
        nDirection[18]=0;
    if(Enemy[18].top()==180)
        nDirection[18]=1;
    if(nDirection[18]){
        Enemy[18].setTop(Enemy[18].top()+10);
        Enemy[18].setBottom(Enemy[18].bottom()+10);
    }
    else{
        Enemy[18].setTop(Enemy[18].top()-10);
        Enemy[18].setBottom(Enemy[18].bottom()-10);
    }

    //碰到敌人血量减一
    for(int i=0;i<15;i++){
        if(Person==Enemy[i]){
            bloods--;
            if(bloods==0){
                sDisplay="游戏失败";
                blsOver=true;}
        }
    }
    update();
}
void ThirdFloor::keyPressEvent(QKeyEvent *event){
    QKeyEvent *key=(QKeyEvent*) event;
    switch(key->key()){
    case Qt::Key_Up:{
        int a=1;
        if(Person.top()==10)
            a=0;
        if(Person.top()==120&&(Person.left()>=10&&Person.left()<=50))
            a=0;
        if(Person.top()==50&&(Person.left()>=60&&Person.left()<=120))
            a=0;
        if(Person.top()==80&&Person.left()==130)
            a=0;
        if(Person.top()==150&&Person.left()==90)
            a=0;
        if(Person.top()==120&&(Person.left()>=100&&Person.left()<=170))
            a=0;
        if(Person.top()==120&&Person.left()==210)
            a=0;
        if(Person.top()==50&&(Person.left()>=220&&Person.left()<=280))
            a=0;
        if(Person.top()==220&&Person.left()==50)
            a=0;
        if(Person.top()==190&&(Person.left()>=60&&Person.left()<=80))
            a=0;
        if(Person.top()==220&&Person.left()==130)
            a=0;
        if(Person.top()==160&&(Person.left()>=140&&Person.left()<=200))
            a=0;
        if(Person.top()==220&&(Person.left()>=220&&Person.left()<=240))
            a=0;
        if(Person.top()==190&&Person.left()==250)
            a=0;
        if(Person.top()==180&&(Person.left()>=260&&Person.left()<=280))
            a=0;
        if(a){
            Person.setTop(Person.top()-10);
            Person.setBottom(Person.bottom()-10);
        }
        break;}
    case Qt::Key_Down:{
        int b=1;
        if(Person.top()==240)
            b=0;
        if(Person.top()==100&&(Person.left()>=10&&Person.left()<=40))
            b=0;
        if(Person.top()==30&&(Person.left()>=50&&Person.left()<=130))
            b=0;
        if(Person.top()==100&&(Person.left()>=100&&Person.left()<=160))
            b=0;
        if(Person.top()==70&&Person.left()==90)
            b=0;
        if(Person.top()==140&&Person.left()==50)
            b=0;
        if(Person.top()==170&&(Person.left()>=60&&Person.left()<=90))
            b=0;
        if(Person.top()==140&&(Person.left()>=130&&Person.left()<=210))
            b=0;
        if(Person.top()==180&&Person.left()==170)
            b=0;
        if(Person.top()==200&&(Person.left()>=220&&Person.left()<=240))
            b=0;
        if(Person.top()==70&&Person.left()==250)
            b=0;
        if(Person.top()==160&&(Person.left()>=260&&Person.left()<=280))
            b=0;
        if(Person.top()==30&&(Person.left()>=210&&Person.left()<=280))
            b=0;
        if(b){
            Person.setTop(Person.top()+10);
            Person.setBottom(Person.bottom()+10);
        }
        break;}
    case Qt::Key_Left:{
        int c=1;
        if(Person.left()==10)
            c=0;
        if(Person.left()==60&&(Person.top()>=50&&Person.top()<=110))
            c=0;
        if(Person.left()==140&&(Person.top()>=40&&Person.top()<=70))
            c=0;
        if(Person.left()==100&&(Person.top()>=80&&Person.top()<=100))
            c=0;
        if(Person.left()==100&&(Person.top()>=120&&Person.top()<=140))
            c=0;
        if(Person.left()==180&&(Person.top()>=10&&Person.top()<=110))
            c=0;
        if(Person.left()==220&&(Person.top()>=50&&Person.top()<=110))
            c=0;
        if(Person.left()==60&&(Person.top()>=150&&Person.top()<=170))
            c=0;
        if(Person.left()==60&&(Person.top()>=190&&Person.top()<=210))
            c=0;
        if(Person.left()==100&&(Person.top()>=180&&Person.top()<=240))
            c=0;
        if(Person.left()==140&&(Person.top()>=160&&Person.top()<=210))
            c=0;
        if(Person.left()==180&&(Person.top()>=190&&Person.top()<=240))
            c=0;
        if(Person.left()==220&&(Person.top()>=150&&Person.top()<=200))
            c=0;
        if(Person.left()==250&&Person.top()==210)
            c=0;
        if(Person.left()==220&&(Person.top()>=220&&Person.top()<=240))
            c=0;
        if(Person.left()==260&&(Person.top()>=80&&Person.top()<=160))
            c=0;
        if(Person.left()==260&&Person.top()==180)
            c=0;
        if(c){
            Person.setLeft(Person.left()-10);
            Person.setRight(Person.right()-10);
        }
        break;}
    case Qt::Key_Right:{
        int d=1;
        if(Person.left()==280)
            d=0;
        if(Person.left()==40&&(Person.top()>=150&&Person.top()<=210))
            d=0;
        if(Person.left()==80&&(Person.top()>=190&&Person.top()<=240))
            d=0;
        if(Person.left()==120&&(Person.top()>=150&&Person.top()<=210))
            d=0;
        if(Person.left()==160&&(Person.top()>=190&&Person.top()<=240))
            d=0;
        if(Person.left()==200&&(Person.top()>=160&&Person.top()<=240))
            d=0;
        if(Person.left()==240&&(Person.top()>=80&&Person.top()<=180))
            d=0;
        if(Person.left()==80&&(Person.top()>=80&&Person.top()<=140))
            d=0;
        if(Person.left()==160&&(Person.top()>=10&&Person.top()<=100))
            d=0;
        if(Person.left()==120&&(Person.top()>=50&&Person.top()<=70))
            d=0;
        if(Person.left()==200&&(Person.top()>=40&&Person.top()<=110))
            d=0;
        if(d){
            Person.setLeft(Person.left()+10);
            Person.setRight(Person.right()+10);
        }
        break;}
    default:;
    }
    for(int i=0;i<19;i++){
        if(Person==Enemy[i]){
            bloods--;
            if(bloods==0){
                sDisplay="游戏失败";
                blsOver=true;}
        }
    }
    if((Person.top()>=130&&Person.top()<=140)&&(Person.left()>=270&&Person.left()<=280)){
        sDisplay="游戏成功";
        blsSuccess=true;
    }
    for(int i=0;i<5;i++){
        if(Person==Secrect[i]&&s[i]){
            srand((unsigned)time(0));
            for(int i=0;i<10;i++)
                ran_num=rand()%6;
            if(ran_num<=1)
                bloods--;
            else
                score+=50;
            s[i]=0;
            if(bloods==0){
                sDisplay="游戏失败";
                blsOver=true;}
        }
    }
    update();
}

void ThirdFloor::Sleep(unsigned int msec){
    QTime reachtime=QTime::currentTime().addMSecs(msec);
    while(QTime::currentTime()<reachtime)
        QCoreApplication::processEvents(QEventLoop::AllEvents,100);         //延时函数
}
